package source {
    import flash.geom.Point;
    import net.flashpunk.graphics.Image;
    import source.Control.Juego;
    import source.Control.Menu;
    import source.Control.Vista;
    import source.Objetos.PJ;
    
	/**
	 * Esta clase contiene una colección de variables globales y de funciones muy generales
     * para usarlas en cualquier lugar del código
	 */
	public class Global	{
        //Worlds:
        public static var juego:Juego;
        public static var menu:Menu;
        
        //Variables "globales":
		public static var
            bufferPantalla:Image, //guardará una "captura" de la pantalla en determinados momentos para luego funcionar como fondo en los menús
            
            //Variables de control del juego:
            slot:uint = 0,              //almacena qué slot estamos utilizando para guardar y cargar la partida
            enJuego:Boolean = false,    //indica si estamos en plena partida (hemos comenzado o cargado una)
			idPantallaActual:int = 0,   //la ID de la pantalla actual
			juegoParalizado:Boolean = false, //indica si el juego está paralizado (por ejemplo cuando nos teletransportamos, hablamos con NPCs o morimos)
			
            //Objetos básicos del juego:
			pj:PJ,       //objeto que gestiona el pj
			pjTemp:PJ,   //objeto temporal para cambiar de pantalla y resucitar tras morir
			vista:Vista, //la cámara
			
			//variables relativas a salir y entrar de áreas por los bordes:
			salirPantalla_porBorde:Boolean = false, //indica si hemos de cargar otro área
			salirPantalla_porBorde_Lado:String,     //indica por qué lado debemos salir de la pantalla
			pantallaN:int, //guarda la ID de la pantalla que se conecta por el norte con la actual
			pantallaE:int, //guarda la ID de la pantalla que se conecta por el este con la actual
			pantallaS:int, //guarda la ID de la pantalla que se conecta por el sur con la actual
			pantallaO:int, //guarda la ID de la pantalla que se conecta por el oeste con la actual
			
			//variables relativas a salir y entrar de áreas por puertas o teletransportes:
			salirPantalla_porPuerta:Boolean = false,         //indica si hemos de cargar otro área
			salirPantalla_porTeletransporte:Boolean = false, //indica si hemos de cargar otro área
			pantallaDestino:int,
			tileDestino:Point,
			
			//variables relativas a la resurrección tras morir o a la reaparición tras cargar partida:
			respawn:Boolean = false, //indica si hemos de respawnear
			savepointDestino:int;   //es la id de la pantalla del savepoint donde se guardó la última vez
			
        //Constantes de ajuste:
		public static const
            //Resolución del juego:
            resAncho:uint = 800,
            resAlto:uint = 600,
            
            //Presentación:
            tiempoPausa:uint = 90,
            tiempoFade:uint = 30,
            
            //Rejilla y configuración del tileset:
            grid:int = 25,
            columnasTileset:int = 20,
            
            //Gráfico y hitbox del PJ:
            anchoSpritePJ:uint  = 36,
            altoSpritePJ:uint   = 50,
            anchoHitboxPJ:uint  = 18,
            altoHitboxPJ:uint   = 41,
            offsetXHitboxPJ:int = -9,
            offsetYHitboxPJ:int = -9,
            
            //Proyectiles:
            tiempoVida:uint = 180,       //timer que pone una "caducidad" al proyectil. Por protección ante "flooding" de proyectiles
            factorGravedad:Number = 1/6, //para que a los proyectiles les afecte la gravedad más o menos
            
            //Proyectil del PJ:
            cadenciaDisparo:uint = 40, //cuanta MENOS cadencia, más rápido podemos disparar
            proyectilPJ_velocidad:Point = new Point(20, 0),
            proyectilPJ_tieneMasa:Boolean = false,
            proyectilPJ_altura:int = -18, //la altura a la que el pj dispara el proyectil, a aprtir de los pies       
            
            //Velocidades máximas ('x': desplazamiento, 'y': altura de salto) tanto en aire como en agua:
            maxVelCaminar_enAire:Point = new Point(2,   10.1),
            maxVelCorrer_enAire:Point  = new Point(4,   10.1),
            maxVelCaminar_enAgua:Point = new Point(0.5, 3),
            maxVelCorrer_enAgua:Point  = new Point(1,   3),
            velGolpeDescendente_enAire:uint = 16,
            velGolpeDescendente_enAgua:uint = 12,
            
            //Enemigos:
            maxVelEnemigos_enAire_y = 10.1, //restringirá la altura de salto en aire
            maxVelEnemigos_enAgua_y = 10.1, //restringirá la altura de salto en agua
            
            //Reproducción de sonidos:
            periodoSfxCaminar:uint = 25, //periodo con el que se reproducen los pasos, expresado en frames
            periodoSfxCorrer:uint = 15,  //periodo con el que se reproducen los pasos, expresado en frames
            
            //Gravedad en aire y en agua:
			gravedad_enAire:Number = 0.6,
            gravedad_enAgua:Number = 0.05,
            
            //Tiempos mínimos y máximos del comportamiendo de los NPCs:
            npcTiempoMinReorientacion:uint = 120, //tiempo mínimo que esperará el NPC para cambiar su dirección de encaramiento cuando está parado
            npcTiempoMaxReorientacion:uint = 240, //tiempo máximo que esperará el NPC para cambiar su dirección de encaramiento cuando está parado
            npcTiempoMinMoverse:uint = 120,       //tiempo mínimo que esperará el NPC para moverse hasta su siguiente nodo, si tiene
            npcTiempoMaxMoverse:uint = 1200,      //tiempo máximo que esperará el NPC para moverse hasta su siguiente nodo, si tiene
            
            //Tiempo para que una caja comience a desplazarse tras empezar a empujarla:
            cajaTiempoEmpuje:uint = 30;

        /**
         * numaleat
         * Genera un número aleatorio entre min y max (incluídos)
         */
        static public function numAleat(min:int, max:int):int {
            return Math.floor(Math.random()*(max - min + 1)) + min;
        }
	}
}















//